Equipe Zelda :
Zoé Boutin, Brian Diffo Diffo, Hanxiao Sun, HUANG He
Dans le cadre de l’unité d’enseignement IF36 de l’Université de Technologie de Troyes, nous entreprenons ce projet d’analyse exploratoire d’un dataset choisi pour mettre en pratique nos connaissances en data visualisation.
Les données utilisées dans ce projet de data visualisation sont des informations sur des chansons publiées sur Spotify et Youtube. Nous avons accès à des informations générales sur chaque titre comme l’artiste et l’album ou le single dont il est issu, ainsi que des attributs comme le tempo, la duration ou encore la danceabilité. Notre jeu de données peut être répartit en trois sous-groupes : les informations générales sur le titre, les informations liées à Spotify (nombre de streams, URI,…) et les informations liées à Youtube (nombre de vues, nombres de likes, chaîne youtube,…).
Les données ont été collectées sur la plateforme Kaggle. Mais le dataset ne contenait pas les dates de sortie des chansons, ce qui est une information très importante. Nous avons donc utilisé l’identifiant unique de chaque chanson (URI) pour récupérer sa date de sortie grâce à l’API Spotify et la bibliothèque ‘spotifyr’ de R.
Nous avons choisi ce jeu de données du fait de la diversité et richesse des données. Le dataset comprend 19064 lignes, chaque ligne représentant une chanson d’artistes variés à travers le monde. Les 26 variables présentes pour chaque chanson offrent une richesse d’informations, incluant des données générales plus textuelles sur chaque titre comme le nom de la chanson et l’artiste. Mais ce qui nous a particulièrement plu sont les informations statistiques sur les plateformes Spotify et Yotube, qui nous permettront de faire une comparaison entre les deux plateformes. Enfin, le dataset comporte des données sur les attributs musicaux de chaque chanson (danceabilité, énergie, tonalité, volume,…) sous forme de coefficients ou autre valeurs numériques que l’ont a trouvé très pertinent à analyser.
La musique est un élément central de la culture populaire, touchant un large public. Analyser les données musicales permet non seulement d’explorer des tendances et des comportements sur les plateformes populaires comme Spotify et Youtube, mais aussi de répondre à des questions d’intérêt général sur la musique, comme :
Quels sont les attributs musicaux des chansons les plus streamées ou les plus vues ?
Y a-t-il une corrélation entre les streams Spotify et les vues YouTube ?
Quels genres ou artistes sont les plus populaires ?
Nous avons tous utilisé Spotify ou Youtube pour écouter de la musique, ce qui rend le sujet non seulement pertinent mais aussi personnellement intéressant. En travaillant sur ce projet, nous pouvons combiner notre passion pour la musique avec nos compétences techniques en data science, ce qui rend l’expérience d’apprentissage à la fois enrichissante et motivante.
Comment les caractéristiques musicales et les métriques d’engagement des chansons publiées sur Spotify et YouTube influencent-elles leur popularité et leur consommation sur ces plateformes de streaming, et quelles tendances peuvent être dégagées de ces données en termes de temporalité, d’attributs musicaux et de comportement des utilisateurs ?
Nous avons centré notre analyse autour de certains axes d’analyse pour répondre à cette problématique :
Influence des caractéristiques musicales : Analyse des attributs des chansons (danceabilité, énergie, etc.) sur leur popularité.
Temporalité : Impact de la date de sortie des chansons sur leur nombre de streams et de vues.
Comparaison des plateformes : Relation entre les métriques d’engagement sur Spotify et YouTube.
Consommation des singles vs. albums : Préférences des utilisateurs pour différents types de publications.
Effet des caractéristique supplémentaires (featuring, musique officielle et/ou sous license) : Impact des collaborations, de l’officialité et des licenses sur la popularité des titres.
Evolution des tendances : Changements dans les attributs des chansons au fil du temps.
Nous utilisons des librairies non inhérentes au R basique dans notre analyse explorative. Les librairies/packages que nous chargeons font partie du Tidyverse.
# Uncomment the lines if you need to install a package before loading it:
# install.packages("readr")
# install.packages("dplyr")
# install.packages("tidyr")
# install.packages("stringr")
# install.packages("tibble")
# install.packages("ggplot2")
# install.packages("patchwork")
# install.packages("ggforce")
# install.packages("tidyverse")
# install.packages("cluster")
# install.packages("factoextra")
# install.packages("factomineR")
# install.packages("glue")
# install.packages("ggtext")
# install.packages("gridExtra")
# install.packages("stringr")
# install.packages("ggstatsplot")
# install.packages("plotly")
library(readr)
library(dplyr)
##
## 载入程辑包:'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(tidyr)
library(stringr)
library(tibble)
library(ggplot2)
library(patchwork)
library(ggforce)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ purrr 1.0.2
## ✔ lubridate 1.9.3
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(cluster)
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(FactoMineR)
library(glue)
library(ggtext)
library(gridExtra)
##
## 载入程辑包:'gridExtra'
##
## The following object is masked from 'package:dplyr':
##
## combine
library(stringr)
library(ggstatsplot)
## You can cite this package as:
## Patil, I. (2021). Visualizations with statistical details: The 'ggstatsplot' approach.
## Journal of Open Source Software, 6(61), 3167, doi:10.21105/joss.03167
library(plotly)
##
## 载入程辑包:'plotly'
##
## The following object is masked from 'package:ggplot2':
##
## last_plot
##
## The following object is masked from 'package:stats':
##
## filter
##
## The following object is masked from 'package:graphics':
##
## layout
library(lubridate)
Notre jeu de données est stocké dans un fichier CSV (Excel). Nous devons importer les données dans notre code pour les transformées en ‘dataframe’ (type de variable en R) afin de pouvoir utiliser des fonctions de R et de nos librairies du Tidyverse pour ‘Explorer’ nos données.
# Nous travaillons avec le fichier ayant le chemin suivant : "/data/dataset_if36"
dataset_if36 <- read.csv('dataset_if36.csv')
La date étant sous format chaine de caractère , cette transformation permettra de faciliter les analyses liées à l’évolution du temps.
#en R , les doubles crochet[[]] permettent d'accéder aux élements d'une liste et non d'un vecteur[]
#sapply est une fonction en R permettant d'appliquer une fonction à chaque élément d'un vecteur
df <- dataset_if36 %>%
mutate(date_split = strsplit(date, split = "-"),
annee = as.double(sapply(date_split, "[", 1)),
mois = as.double(sapply(date_split, "[", 2))) %>%
select(-date_split) %>%
filter(!is.na(annee) & !is.na(Stream) & !is.na(Views)) %>%
filter(is.finite(Stream) & is.finite(Views)) %>%
filter(annee!=0)
df_sorted <- df %>%
filter(annee!=0)%>%
arrange(annee, mois)
Maintenant que nos données sont chargées, elles sont prêtes pour l’analyse.
Afin de facilité la compréhension et la répartition des tâches, nous avons organisé notre analyse par question.
La date de sortie d’un titre a-t-elle un effet sur son nombre d’écoutes ?
Sous-question : Est-ce que l’échantillon de titres du dataset est composé majoritairement de titres qui sont ‘populaires’ indépendamment du temps ?
On s’attend à ce que : plus un titre a été publié il y a longtemps, plus il a de views/streams.
Ou à l’inverse, la date de publication n’a pas une grande corrélation avec le nombre d’écoutes et donc on peut dire que ce nombre d’écoute est purement lié à la popularité du titre.
df_q1 <- df %>%
select(date, annee, mois, Stream, Views, Likes)
#Transformation du type de la colonne 'date' de chr à date
df_q1$date <- as.Date(df_q1$date)
head(df_q1)
## date annee mois Stream Views Likes
## 1 2005-05-23 2005 5 1040234854 693555221 6220896
## 2 2010-03-03 2010 3 310083733 72011645 1079128
## 3 2022-08-31 2022 8 63063467 8435055 282142
## 4 2010-03-03 2010 3 434663559 211754952 1788577
## 5 <NA> 2001 NA 617259738 618480958 6197318
## 6 2005-05-23 2005 5 323850327 259021161 1844658
df_q1 <- df_q1 %>%
mutate(ecoutes_totales = Stream + Views)
# Supprimer les lignes avec des valeurs manquantes dans la colonne 'date'
df_q1 <- df_q1[!is.na(df_q1$date), ]
head(df_q1)
## date annee mois Stream Views Likes ecoutes_totales
## 1 2005-05-23 2005 5 1040234854 693555221 6220896 1733790075
## 2 2010-03-03 2010 3 310083733 72011645 1079128 382095378
## 3 2022-08-31 2022 8 63063467 8435055 282142 71498522
## 4 2010-03-03 2010 3 434663559 211754952 1788577 646418511
## 6 2005-05-23 2005 5 323850327 259021161 1844658 582871488
## 7 2022-11-18 2022 11 10666154 451996 11686 11118150
Nous avons donc préparer un dataframe plus restreint pour cette question.
Avant de continuer avec l’analyse de cette question, il est important de comprendre quels choix d’échantillonage ont été faits lors de la création de ce jeu de données. Ce dataset ne comprend pas tous les titres spotify et youtube disponibles (il serait beaucoup trop grand pour notre cas d’utilisation dans ce scénario là), l’échantillon que nous avons a un grand effet sur les résultats et conclusions qu’on pourra en déduire. C’est donc important de comprendre les limitations de notre jeu de données pour les prendre en compte dans nos déductions et conclusions à venir.
df_q1 %>%
ggplot(aes(x = annee)) +
geom_histogram(binwidth = 1, alpha = 0.7,
color = "lightblue", fill = "lightblue") +
scale_y_continuous(expand = expansion(mult = c(0, 0))) +
scale_x_continuous(breaks = seq(min(df_q1$annee), max(df_q1$annee), by = 2)) +
labs(x = "Année",
y = "Count",
title = "Distribution des titres du jeu de données en fonction de l'année de publication") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, hjust = 1, size = 6),
axis.ticks.x = element_line())
On remarque que les chansons de notre dataset sont seulement des titres publiés entre 1918 et 2023. De plus, le jeu de données a beaucoup plus de chansons publiées depuis 2000 qu’avant avec une grande majorité pour les titres publiés en 2022. La distribution en termes d’année de publication du jeu de données n’est donc pas du tout régulière : le dataset est surtout concentré sur les chansons entre 2000 et 2023.
Nous avons pensé à faire un diagramme en camembert par année des chansons pour mieux comprendre la décomposition du jeu de données par années de publication.
# Aggregate data by year and create the new category
df_q1_agg <- df_q1 %>%
mutate(annee_group = case_when(
annee < 2000 ~ '1918-1999',
annee > 1999 & annee < 2016 ~ '2000-2015',
TRUE ~ as.character(annee)
)) %>%
count(annee_group)
# Create the pie chart
df_q1_agg %>%
ggplot(aes(x = "", y = n, fill = annee_group)) +
geom_bar(width = 1, stat = "identity") +
coord_polar(theta = "y") +
scale_fill_brewer(palette = "Paired") +
geom_mark_hull(aes(filter = annee_group == "2022",
label = '2022',
description = 'Environ 1/5 des titres sortis en 2022'),
fill = NA,
color = NA) +
labs(x = NULL,
y = NULL,
fill = "Année",
title = "Décomposition du jeu de données par année de publication") +
theme_minimal() +
theme(axis.text.x = element_blank(),
axis.ticks = element_blank(),
panel.grid = element_blank())
On remarque donc que les titres avant 2000 ne représentent même pas autant de titres de 2022 qui comptent pour environ 1/5 du jeu de données.
D’après la spécifications du jeu de données sur Kaggle : il a été créé et collecté le 7 février 2023. Ceci explique le peu de titres de 2023 malgré la tendance a avoir plus de titres réprésentés, plus le temps avance. L’échantillon de données est plus concentré sur des titres sortis ‘récemment’ par rapport à la création du dataset.
On peut aussi faire cette analyse du choix d’échantillonage vis à vis du nombre d’écoutes.
ecoute_plot <- df_q1 %>%
ggplot(aes(x = ecoutes_totales)) +
geom_histogram(bins = 60, alpha = 0.7,
color = "lightgreen", fill = "lightgreen") +
scale_y_continuous(expand = expansion(mult = c(0, 0))) +
scale_x_continuous(labels = scales::number_format()) +
labs(x = "Année",
y = "Count",
title = "Distribution des titres du jeu de données en fonction du nombre d'écoutes") +
theme_minimal()
ecoute_zoomed_plot <- df_q1 %>%
ggplot(aes(x = ecoutes_totales)) +
geom_histogram(binwidth = 25000000, alpha = 0.7,
color = "lightgreen", fill = "lightgreen") +
scale_y_continuous(expand = expansion(mult = c(0, 0))) +
scale_x_continuous(labels = scales::number_format(), breaks = seq(0, 250000000, by = 25000000)) +
coord_cartesian(xlim = c(0, 500000000), ylim = c(0, 3000)) +
labs(x = "Année",
y = "Count",
title = "Zoom sur le pic vers 0") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 6))
ecoute_plot /
ecoute_zoomed_plot
On remarque que le jeu de données a des titres avec des nombres d’écoutes allant de moins de 50 millions jusqu’à presque 10 milliards. La plupart des titres ont moins de 500 millions d’écoutes totales.
min_ecoutes_totales <- min(df_q1$ecoutes_totales, na.rm = TRUE)
print(min_ecoutes_totales)
## [1] 7020
Le minimum d’écoutes totales est 7020.
Il semble donc que le jeu de données ne soit pas limité à des titres très populaires. Cependant, il est concentré sur des titres relativement beaucoup écoutés : la majorité des titres ayant entre 25 et 50 millions d’écoutes ce qui est quand même conséquent.
On peut maintenant passer à l’analyse plus pertinente à la question
posée.
(Rappel de la question : La date de sortie d’un titre a-t-elle un effet
sur son nombre d’écoutes ?)
# Use factor() to convert a numeric variable into a discrete variable
df_q1 %>%
ggplot(aes(x = factor(annee), y = ecoutes_totales)) +
geom_point(alpha = 0.1, color = "darkcyan") +
scale_y_continuous(labels = scales::number_format()) +
stat_summary(aes(group = 1, color = "Mean"), fun = mean, geom = 'line', size = 1, alpha = 0.7) +
stat_summary(aes(group = 1, color = "Median"), fun = median, geom = 'line', size = 1, alpha = 0.7) +
scale_color_manual(values = c("Mean" = "orange", "Median" = "yellow")) +
labs(x = "Année", y = "Nombre total d'écoutes",
title = "Ecoutes totales par année de publication",
color = "Mesures") +
coord_trans(y = 'log') +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, hjust = 1, size = 6),
legend.position = "right")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Nous avons utilisé un diagramme de points pour d’abord voir ‘toutes’ les données sans appliquer de statistique descriptive comme les boîtes à moustaches. C’est pertinent dans le sens où l’on peut voir la densité des points et on a pû ajouter les courbes de moyenne et médiane pour avoir une légère couche statistique pour aider l’analyse.
On remarque que la moyenne et la médiane sont plutôt constantes en fonction du temps. Il y a une concentration plus élevée de points (titres) plus l’année est grande, ce qui est raccord à notre analyse de la distribution des chansons du jeu de données en fonction de l’année.
En rappelant que l’échelle du nombre d’écoutes est logarithmique, on remarque qu’il y a plus de titres avec un nombre d’écoutes énorme (les valeurs vers 10 milliards d’écoutes qu’on a vues dans la distribution en fonction du nombre d’écoutes) à partir de 2006 environ.
Or c’est aux alentours de 2006-2008 que sont apparues les plateformes de streaming qu’on étudie : Spotify et Youtube. Notre observation d’outliers en termes d’un grand nombre d’écoutes est donc probablement liée à l’émergeance de ces plateformes.
# Créer une nouvelle variable 'decennie' représentant la décennie
df_q1$decennie <- as.factor((as.integer(df_q1$annee) %/% 10) * 10)
# Use factor() to convert a numeric variable into a discrete variable
# Créer le diagramme en boîte avec ggplot2
df_q1 %>%
ggplot(aes(x = factor(decennie), y = ecoutes_totales)) +
geom_boxplot(color = "darkcyan", fill = "lightblue") +
scale_y_continuous(labels = scales::number_format()) +
labs(x = "Décennie", y = "Nombre d'écoutes total", title = "Ecoutes totales par décennie en échelle logarithmique") +
coord_trans(y = 'log10') +
theme_minimal()
Nous avons utilisé un diagramme en boîte à moustache (box and whisker plot) car nous avons discrétisé le temps par année et que nous voulions nous concentrer sur la distribution statistique des valeurs afin d’en extraire des tendances (si il en existe). Ce graph est pertinent car il synthétise bien nos valeurs discrètes et facilite la recherche d’une relation entre la date de publication d’un titre et son nombre d’écoutes total. On peut faire notre analyse en omettant la décennie 1910 étant donné qu’il n’y a qu’un seul titre dans cette période : l’application statistique de la boîte à moustache n’a aucun intérêt dans ce cas précis.
En regroupant par décennie, on retrouve cette présence accrue d’outliers plus écoutés sur les deux dernières décennies. Notre interprétation est qu’avec la démocratisation grandissante des moyens de partager l’information (la musique en faisant partie) vers un grand public, il devient de plus en plus facile pour des chansons de devenir très populaires et ce très vite. La notion de “tubes du moment” ou de “chansons qui font le buzz” que nous connaissons tous aujourd’hui créée des titres qui représentes ces valeurs ‘outliers’ avec des nombres d’écoutes pharamineux dans notre graphique. L’émergeance des plateformes de streaming comme celles qu’on étudie, Spotify et Youtube, permet aussi de rendre plus accessible ces “tubes” ce qui peut à la manière d’une réaction en chaîne, accéléré le phénomène de “buzz” d’un “tube”.
On remarque aussi que les boites qui représentent les valeurs entre le premier quartile et le troisième quartile ont à peu près toutes la même taille et le même nombre d’écoutes médian. Ainsi, même si notre jeu de données a beaucoup plus de titres ‘récents’ : les écoutes totales sont plutôt équilibrées en moyenne. Ceci confirme notre observation que ce jeu de données est plutôt concentré sur des chansons qui sont relativement populaires et ce indépendamment du temps étant donné que nous avons des boîtes à moustaches similaires pour chaque décennie.
Cela confirme donc notre hypothèse initiale que les chansons plus anciennes (surtout celles datant d’avant Spotify et Youtube) représentées dans ce dataset sont des chansons encore toujours relativement “populaires” aujourd’hui : des chansons “intemporelles” comme des titres des Beatles ou de Queen par exemple.
Nous avons fait notre analyse sur le nombre d’écoutes total : retrouve t’on les mêmes conclusions en prenant indépendemment les Streams Spotify et les Vues Youtube ?
# Find the range of the y-axis to use for both plots
y_limits_stream <- range(df_q1$Stream, na.rm = TRUE)
y_limits_view <- range(df_q1$Views, na.rm = TRUE)
shared_y_limits <- range(y_limits_stream, y_limits_view)
# Create the stream plot
stream_plot <- df_q1 %>%
ggplot(aes(x = factor(annee), y = Stream)) +
geom_point(alpha = 0.1, colour = "darkcyan") +
scale_y_continuous(labels = scales::number_format(), limits = shared_y_limits) +
stat_summary(aes(group = 1), fun = mean, geom = 'line', size = 1, colour = "orange", alpha = 0.7) +
stat_summary(aes(group = 1), fun = median, geom = 'line', size = 1, colour = "yellow", alpha = 0.7) +
labs(x = "Année", y = "Nombre de Streams / Vues",
title = "Streams par année de publication") +
coord_trans(y = 'log') +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, hjust = 1, size = 6))
# Create the view plot
view_plot <- df_q1 %>%
ggplot(aes(x = factor(annee), y = Views)) +
geom_point(alpha = 0.1, colour = "darkcyan") +
scale_y_continuous(labels = NULL, limits = shared_y_limits) +
stat_summary(aes(group = 1, color = "Moyenne"), fun = mean, geom = 'line', size = 1, alpha = 0.7) +
stat_summary(aes(group = 1, color = "Médiane"), fun = median, geom = 'line', size = 1, alpha = 0.7) +
scale_color_manual(values = c("Moyenne" = "orange", "Médiane" = "yellow")) +
labs(x = "Année", y = NULL,
title = "Vues par année de publication",
color = "Mesures") +
coord_trans(y = 'log') +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, hjust = 1, size = 6),
legend.position = "bottom")
# Use the patchwork package to display the plots together
stream_plot + view_plot + plot_annotation(title = 'Graphiques en échelle logarithmique')
On peut dire que de manière générale, on retrouve la même forme de graphique quand on prend nos variables indépendantes.
On remarque tout de même que les Streams Spotify sont plus constants au niveau du temps que les Vues Youtube. La moyenne et la médiane des Streams est plutôt constante alors qu’on remarque de plus grandes fluctuations pour les Vues. Le nombre de Vues semble être croissant en fonction de l’année de publication.
Notre interprétation est que les auditeurs/utilisateurs utilisent plus Youtube pour les chansons récentes car il apprécient la valeur ajoutée de la vidéo (la production de “clips” pour les chansons c’est démocratisée depuis l’arrivée de la télévision dans les foyers). Or plus une chansons est ancienne, moins il y a de chance qu’elle est un “clip” associé.
Ainsi, les auditeurs utilisent plus Spotify pour écouter les titres qu’ils apprécient indépendamment de leur ancienneté alors qu’ils utilisent Youtube plus Youtube pour regarder des clips de chansons et moins pour de l’écoute “passive” comme pour Spotify. On pourrait faire l’hypothèse (sans pouvoir la confirmer avec les données qui sont disponibles dans notre jeu de données) que les Streams de Spotify proviennent souvent des mêmes utilisateurs qui écoutent plusieurs fois le même titre parce-qu’ils l’apprécient alors que les Vues Youtube proviennent de plus d’utilisateurs qui découvrent la musique avec son clip (à titre personnel, il est plus probable que je partage un lien Youtube que Spotify pour faire connaitre une chanson que j’aime bien à un.e proche).
Notre dataset est échantilloné sur des titres “populaires” indépendemment de leur date de publication.
Avec l’émergeance de Spotify et Youtube, certaines chansons peuvent plus facilement “faire le buzz”.
Les deux plateformes ne sont pas forcément utilisées pour les mêmes raisons : Spotify plus pour de l’écoute “passive” des titres déjà appréciés alors que Youtube pour pour de la découverte de chansons ?
Existe t’il une relation entre le nombre de streamings Spotify ainsi que le nombre de vues sur Youtube ?
On s’attend à ce que les chansons plus ‘vieilles’ aient plus de vues totales sur Youtube car Youtube existe depuis plus longtemps.
Cependant on s’attend à ce que les chansons plus ‘récentes’ (publiées après Spotify) aient plus de streams totaux sur Spotify car il semblerait que Spotify tend à remplacer Yotube pour l’écoute de musique depuis sa création (hypothèse qu’on pourra essayer de vérifier par l’analyse aussi)
#total des vues et stream de musiques par années
stream_views_annee <- df_sorted %>%
group_by(annee)%>%
summarise(stream=sum(Stream), view=sum(Views))
#chanson avant 2008
stream_view_2008 <- df_sorted %>%
select(Views, Stream, annee, mois)%>%
filter(annee<2008)
#chanson après 2008
stream_view_2009 <- df_sorted %>%
select(Views, Stream, annee, mois)%>%
filter(annee>2008)
#comparaison annuelle entre le nombre de vues et le nombre de stream
ggplotly(ggplot(stream_views_annee) +
geom_line(aes(x = annee, y = stream), color = "blue") +
geom_line(aes(x = annee, y = view), color = "red") +
scale_color_manual(values = c("Stream" = "blue", "View" = "red")) +
scale_x_continuous(breaks = seq(1913, 2023, by = 10)))
## Warning: No shared levels found between `names(values)` of the manual scale and the
## data's colour values.
les deux nuages de point représentent la relation entre le nombre de stream sur Spotify et le nombre de vues sur youtube pour les chansons sorties avant et après 2008. Comme on peut le voir , que se soit avant ou après l’année 2008 qui est l’année à laquelle spotify a été créé , il existe bien une relation qui tend vers la linéarité entre le nombre de stream sur spotify et le nombre de vues sur youtube.
On peut également observer un changement entre les deux nuages de points. en effet à près 2008, la relation est un peu moins linéaire et on a un peu plus de point en dessous de la droite ce qui rejoint notre hypothèse selon laquelle les chancons les plus récentes sont plus streamées sur spotify que visionnées sur Youtube.
Enfin grace au lineplot qui permet de visualiser l’évolution annuelle du nombre de vues sur youtube et du nombre de stream sur spotify on peut voir que pour les chanson sorties à partir de 2010, on a une augmentation du nombre d’écoute sur spotify par rapport à youtube.
Est-ce que les singles sont plus écoutés/appréciés des auditeurs que les albums ?
Rappel : Les valeurs possibles pour la variable ‘Album_type’ sont album, single et compilation.
On s’attend à ce que les singles soit plus écoutés que les albums de manière générale.
On ne sait pas trop à quoi s’attendre pour les compilations
df_q3 <- df %>%
select(Artist, Album_type, Duration_ms, Views, Stream, date, annee, mois) %>%
na.omit()
head(df_q3)
## Artist Album_type Duration_ms Views Stream date annee mois
## 1 Gorillaz album 222640 693555221 1040234854 2005-05-23 2005 5
## 2 Gorillaz album 200173 72011645 310083733 2010-03-03 2010 3
## 3 Gorillaz single 215150 8435055 63063467 2022-08-31 2022 8
## 4 Gorillaz album 233867 211754952 434663559 2010-03-03 2010 3
## 6 Gorillaz album 245000 259021161 323850327 2005-05-23 2005 5
## 7 Gorillaz single 274142 451996 10666154 2022-11-18 2022 11
Maintenant que nous avons un dataframe ‘df_q3’ plus adapté pour cette question, nous allons tout d’abord analyser la proportion de chaque type d’album dans ce jeu de données.
df_q3 %>% ggplot(aes(x = "", fill = Album_type)) +
geom_bar(position = "stack", width = 0.5) +
coord_flip() +
labs(title = "Graphique à barres empilées des Types d'album", x = "", y = "Count") +
theme_minimal() +
scale_fill_manual(values = c("album" = "darkcyan", "compilation" = "lightgreen", "single" = "purple"))
On remarque qu’une grande majorité des titres du dataset sont issus d’un album. Environ 1/4 des titres sont issus d’un single et il y peu de titres issus de compilations.
# Transformer les données en format long
df_long <- df_q3 %>%
pivot_longer(cols = c(Stream, Views), names_to = "Metric", values_to = "Value")
# Créer le boxplot avec facet_wrap
df_long %>% ggplot(aes(x = Metric, y = Value, color = Album_type)) +
geom_boxplot(outliers = FALSE) +
scale_y_continuous(labels = scales::number_format()) +
facet_wrap(~ Album_type) +
labs(title = "Diagramme en Boîte à moustaches de Stream et Views par \nType d'Album", x = "", y = "Nombre de Streams / Vues") +
theme_minimal()

On s’attendais à ce que les singles soient plus écoutés que les albums puisqu’ils sont souvent plus mis en avant de manière individuelle par rapport aux albums. Mais on observe que les albums sont plus écoutés que les singles. Ceci est surtout vrai sur Spotify : il n’y a pas de grande différences pour Youtube.
Il n’y a pas de grande différence entre les singles et les compilations, la moyenne des Streams pour les singles est légèrement plus élevée mais les médianes sont très proches. On peut à la limite dire qu’il y a plus de d’outliers avec un grand nombre d’écoute pour les singles que pour les compilations.
Les chansons issues d’album sont bien plus écoutés que les singles, surtout sur la plateforme Spotify.
Les valeurs restent tout de même assez serrées, cette analyse n’est pas très conclusive : il faudrait peut-être plus de données pour faire une analyse par artiste entre les singles, albums et compilations. (Il n’y a pas assez de titres par artiste dans notre dataset pour avoir des résultats exploitables)
Y-a-t-il un lien entre les différents attributs des chansons et leur popularité ?
On pourra par exemple aussi ajouté la comparaison avec la valeurs moyenne des attributs en fonction du nombre d’écoutes/la popularité.
Variables : attributs, ‘Streams’, ‘Views’, ‘Likes’, ‘Comments’ Objectif : Relation + Comparaison avec valeurs discrètes (nombres d’écoutes) et continues (attributs).
Hypothèses :
On peut s’attendre à ce que les titres avec plus de mots parlés soient plus populaires.
On peut aussi s’attendre à avoir une répartition avec beaucoup de titres ‘lives’ avec très peu d’écoutes mais aussi beaucoup avec un grand nombre d’écoutes car c’est un attribut dans une chanson qui peut être plus tranchant pour les auditeurs. On suppose que beaucoup de gens adorent la musique ‘live’ mais aussi beaucoup de gens la détestent aussi.
Pour vérifier nos Hypothèses, il souffit de calculer la popularité des différents type de musique. Le résultat de la question 7, qui a catégoriesé tous les morceaux dans le jeu de donnée, est très utile pour répondre à cette question. A la fin de la question 7, on trouve un résultat en format csv, qui contient le cluster des chanson et ses indicateurs de popularité :
# résultat <- data %>% select (Artist,
# Track,
# Album,
# Stream,
# Views,
# Likes,
# Comments)
# %>% mutate (Cluster = clusters)
# %>% arrange(Cluster)
#
# write.csv(résultat, "résultat.csv", row.names = FALSE)
A partir de ce fichier, on peut faire une comparaison entre les chansons de différent cluster :
# data <- read.csv("résultat.csv")
#
# moyen_indicateurs <- data %>% group_by(Cluster)
# %>% summarize(moyen_stream = mean(Stream , na.rm = TRUE),
# moyen_views = mean(Views , na.rm = TRUE),
# moyen_likes = mean(Likes , na.rm = TRUE),
# moyen_comments = mean(Comments, na.rm = TRUE))
#
# normalize <- function(x)
# {
# return((x - min(x)) / (max(x) - min(x)))
# }
#
# moyen_normalisé <- moyen_indicateurs %>% mutate(moyen_stream = normalize(moyen_stream ),
# moyen_views = normalize(moyen_views ),
# moyen_likes = normalize(moyen_likes ),
# moyen_comments = normalize(moyen_comments))
#
#
# moyen_indicateurs_long <- moyen_normalisé %>% pivot_longer(cols = starts_with("moyen"),
# names_to = "Indicateurs",
# values_to = "Moyen")
#
#
# ggplot(moyen_indicateurs_long,
# aes(x = as.factor(Cluster),
# y = Moyen,
# fill = Indicateurs)) +
# geom_bar(stat = "identity",
# position = "dodge") +
# labs(title = "Popularité Clusters",
# x = "Cluster",
# y = "Popularité") +
# theme_minimal() +
# theme(text = element_text(color = "black"),
# axis.text.x = element_text(color = "black"))
Voici le résultat, les données sont normalisé car la différence entre les groupes sont trop grande, donc les données sont présentées sous la forme de pourcentage. Le cluster plus populaire, donc le cluster n°2, est considéré comme 100%, et le cluster moins populiare, le n°6, est représenté comme 0%.
On trouve que les chansons plus populaires est ceux qui est dancable et avec valence. La performance des “lives” ne sont pas vraiment très mauvais. Ils se sont classés en quarième mais il ne présente pas une grande différence absolute par rapport aux autres groupes. Pauvre musique classique “instrumentale” et “acoustique”, s’est classée sans doute en dernière position.
Quel est le lien entre le nombre de commentaires et/ou le nombre de likes et le nombre d’écoutes d’un titre ?
Variables : ‘Streams’, ‘Views’, ‘Likes’, ’Comments
Objectif : Relation avec valeurs discrètes.
Rappel : On suppose qu’on pourra repérer un seuil de nombres d’écoutes à partir duquel la quantité de like et/ou commentaires augmentent fortement. En bref, le signal à partir de ce seuil passerait de linéaire à exponentiel.
Cette hypothèse vient du fait que nous supposons qu’à partir de cette valeur seuil, il y a assez d’engouement pour un titre pour qu’il “fasse le buzz”.
On a pensé à cette valeur seuil car les algorithmes de recommandation de Youtube cherchent à “faire buzzer” des vidéos (du peu que nous connaissons de ces algorithmes du côté utilisateur).
ggplot(dataset_if36, aes(x = Stream, y = Likes + 1)) +
geom_point(alpha = 0.2, size = 0.3) +
ggtitle("Relationship between Streams and Likes") +
xlab("Streams") +
ylab("Likes") +
coord_fixed() +
scale_x_log10(labels = scales::number_format()) +
scale_y_log10(labels = scales::number_format())
Ce diagramme de dispersion représente la relation entre le nombre de streams sur Spotify et le nombre de likes reçus par la musique.
On peut constater qu’avec l’augmentation du nombre de streams, le nombre de likes augmente également, ce qui suggère que le contenu plus populaire obtient généralement plus de likes, ce qui est conforme à notre compréhension quotidienne.
Avec l’augmentation du nombre de streams, la dispersion du nombre de likes augmente également. Lorsque le nombre de streams atteint 100 000, la plupart des likes se situent entre 1 et 100 000, mais lorsque le nombre de streams atteint 1 000 000 000, le nombre de likes varie de 1 à près de 100 000 000. Cela indique une plus grande incertitude quant aux likes pour le contenu avec un grand nombre de streams.
Il existe quelques valeurs aberrantes possibles dans le graphique, en particulier dans la zone de forts streams. Les points ayant un grand nombre de streams mais un nombre de likes très faible peuvent représenter de la diffusion virale ou du marketing excessif de la musique.
ggplot(dataset_if36, aes(x = Views, y = Likes + 1)) +
geom_point(alpha = 0.15, size = 0.3) +
geom_smooth(method = "lm", se = FALSE, color = "blue", linewidth = 0.5) +
ggtitle("Relationship between Views and Likes") +
xlab("Views") +
ylab("Likes") +
coord_fixed() +
scale_x_log10(labels = scales::number_format()) +
scale_y_log10(labels = scales::number_format())
## `geom_smooth()` using formula = 'y ~ x'
Ce graphique de dispersion représente la relation entre le nombre de vues sur YouTube et le nombre de likes reçus par la musique.
On peut observer qu’avec l’augmentation du nombre de vues, le nombre de likes augmente également. Cette forte corrélation positive suggère que les vidéos avec un grand nombre de vues ont tendance à recevoir davantage de likes. Cela est logique, car une exposition accrue entraîne généralement plus d’interaction.
En même temps, sur une échelle logarithmique, la distribution des points se rapproche d’une ligne droite. On peut ajouter une ligne dans le graphique pour visualiser cela, ce qui indique une relation de puissance entre les vues et les likes. Sur une échelle logarithmique, chaque augmentation de pourcentage fixe dans le nombre de vues entraîne également une augmentation de pourcentage fixe dans le nombre de likes.
ggplot(dataset_if36, aes(x = Views, y = Comments + 1,
color = ifelse(Comments + 1 < 2, "blue", "black"))) +
geom_point(alpha = 0.2, size = 0.3) +
ggtitle("Relationship between Views and Comments") +
xlab("Views") +
ylab("Comments") +
coord_fixed() +
scale_x_log10(labels = scales::number_format()) + # Assuming there are no zero or negative values in Views
scale_y_log10(labels = scales::number_format()) +
scale_color_manual(values = c("blue" = "blue", "black" = "black"))+
theme(legend.position = "none")
Ce graphique de dispersion représente la relation entre le nombre de vues sur YouTube et le nombre de commentaires reçus par la musique.
En observant les points noirs, on peut remarquer qu’avec l’augmentation du nombre de vues, le nombre de commentaires augmente également. Cette corrélation positive suggère que les vidéos avec un grand nombre de vues ont tendance à recevoir plus de commentaires.
Les points bleus dans le graphique représentent les cas où le nombre de commentaires est de zéro. Certains vidéos, bien qu’ayant un grand nombre de vues, n’ont toujours pas de commentaires. Cela peut être dû au fait que les créateurs ont désactivé les commentaires sur la vidéo.
Pour des vidéos avec le même nombre de vues, le nombre de commentaires peut varier. Cela peut être dû au contenu de la musique, certaines musiques étant plus susceptibles de susciter des commentaires que d’autres. De plus, pour des vidéos avec le même nombre de commentaires, le nombre de vues peut également varier. Par exemple, il existe des vidéos avec plus d’un million de vues qui ont moins de dix commentaires, tandis que d’autres vidéos avec moins de mille vues ont également moins de dix commentaires. Cela peut être dû à la nature de la musique, certaines musiques, telles que la musique de fond ou la musique dans une langue moins courante, pouvant inciter les spectateurs à apprécier la mélodie sans nécessairement laisser de commentaires.
Il existe une corrélation positive entre le nombre de streams sur Spotify et le nombre de likes, entre le nombre de vues sur YouTube et le nombre de likes, ainsi qu’entre le nombre de vues sur YouTube et le nombre de commentaires. Cependant, différent à ce que l’on pourrait penser, ces relations ne suivent pas une progression linéaire dès le départ et après une progression exponentielles. Parmi ces relations, la relation entre le nombre de vues sur YouTube et le nombre de likes suivre une loi de puissance de manière assez évidente.
Est-ce possible de discerner des ‘modes’ en termes d’attributs de chansons en fonction du temps ?
Par exemple : le rap qui était à la mode à une période donnée et donc plus de titres avec les attributs ‘Speechiness’ élevé et ‘Instrumentalness’ faible.
Il s’agit donc ici d’essayer de repérer des intervalles de valeurs communes pour les attributs des titres d’une même période.
Variables : attributs, ‘date’
Objectif : Relation + Evolution (+ distribution/statistique) avec valeurs continues (attributs) et ordinales (dates qu’on catégorisera en périodes : intervalles de dates).
Hypothèses :
On s'attend à ce qu'on retrouve des intervalles de valeurs pour les attributs qui auront une densité légèrement plus élevée : il sera cependant probablement difficile de raccorder ces données à un genre précis de musique comme le rap donné en exemple.
La difficulté avec cette question/analyse est que sans savoir ce qu'on cherche, il sera peut-être difficile de repérer des schémas/patterns pour les attributs des chansons en fonction de la période. Il est donc possible que notre analyse soit difficilement conclusive.
Une chansons est caractérisée par différents attributs qui sont son acoustique, ses paroles , sa dansabilité ainsi que son intensité se sont ces différentes caractéristiques qui définissent une chanson. Le but de notre recherche est de déterminer si durant certaine période certain de ces attributs dominent plus que les autres c’est à dire si par exemple en l’an XXXX les chansons avec beaucoup paroles était populaire.
Pour réaliser cette analyse , nous avons d’abord normalisé ces attribut pour leur donner les même échelles et nous avons ensuite pour chaque année compter le nombre de musique ou chaque attribut domine. On peut voir par exemple en 1962 que 84% des chansons ont un aspect acoustique relativement important. Et c’est le cas durant toutes les années de 1960 à 1980. Par contre cette tendance évolue en effet durant les années 2000 on peut observer que cette répartition des chanson se stabilise et on a à peu près un équilibre entre les différents attributs.
Au vu de cette analyse , on peut conclure que oui le caractère acoustique, parole ou dansabilité des différentes chansons évolue avec le temps. Il y’a des période où les chansons avec beaucoup d’acoustiques sont les plus répandues et d’autres où elles le sont moins
Est-ce qu’on peut reconnaître un artiste / un album par une combinaison des attributaires ?
‘Artist’,
‘Album’,
Les variables quantitatives
musicales(“Danceability”,“Energy”,“Key”,“Loudness”,“Speechiness”,“Acousticness”,“Instrumentalness”,“Liveness”,“Valence”,“Tempo”)
(attributs) et nominales (artistes, albums).
Une combinaison des attributs, c’est un style musical. Nous pouvons reconnaître un artiste/un album en comptant le nombre des chansons dans différent styles.
Pour atteindre cet objectif, il faut trouver un moyen pour définir les différentes styles musicale. Nous pouvons faire l’étude à partir de la relation et la corrélation entre les variables quantitatives. Il y a beaucoup de variables qui peut décrire le style musical dans notre jeu de données choisi : “Danceability”,“Energy”,“Key”,“Loudness”,“Speechiness”,“Acousticness”,“Instrumentalness”,“Liveness”,“Valence”,“Tempo”.
Il sont nombreux, il est donc logique de faire d’abord un analyse en composantes principales pour rendre une représentation 2D possible.
data <- read.csv("dataset_if36.csv")
variables_actives <- data %>% select(Danceability,
Energy,
Key,
Loudness,
Speechiness,
Acousticness,
Instrumentalness,
Liveness,
Valence,
Tempo)
donnée_centrée_réduite <- scale(variables_actives)
résultat.ACP <- PCA(donnée_centrée_réduite, graph = FALSE)
Pour analyse le résultat, nous imprimons l’inertie des composantes principales et le cercle de corrélation :
# L’inertie des cps
#fviz_eig(résultat.ACP)
# Cercle des corrélations
#fviz_pca_var(pca_result)
Le
cercle de corrélation nous montre qu’il existe plusieurs groupes
d’attribut : Danceability et Valence Loudness et Energy Tempo et
Liveness Acousticness et Instrumentalness Speechiness et Key(ce groupe
ne donne pas beaucoup de contribution sur les cps.)
Maintenant nous pouvons continuer notre analyse, nous allons essayer de trouver les différente sytle musicale par la classification ascendante hiérarchique :
# matrice_dist <- dist(résultat.ACP$ind$coord[, 1:2],
# method = "euclidean")
# CAH <- cutree(hclust(matrice_dist, method = "ward.D2"),
# k = 6)
Si on faire une combinaison du résultat de la classification ascendante hiérarchique et le cercle de corrélation, on trouve que les groupes de variable dans le cercle de corrélation nous permettent de décrire les clusters. Par exemple, le cluster 1 est Ce cluster est fortement influencé par Danceability et Valence, le cluster 2 est influencé par Loudness et Energy, etc.
On peut maintenant valider notre hypothèse grâce à ce découvert. Le nuage de point des titres et aussi un nuage de point des artiste. Prenons l’exemple de groupe Musicale “AC/DC”, on liste nombre de ses ouvres dans chaque cluster :
Cluster 1 (“Loudness” , “Energy” ) : 3
Cluster 2 (“Dancablity”, “Valence” ) : 2
Cluster 3 : 0
Cluster 4 (“Tempo” , “Liveness”) : 4
Cluster 5 : 0
Cluster 6 : 0
Donc on trouve les caractères liés au ce groupe, et ces caractères
correspondent bien notre impression sur “AC/DC” ! . #### Conclusion :
Reconnaître un artiste/un album par des attributs est tout à fait
possible. Grâce à une combinaison d’analyse en composantes principales
et la classification ascendante hiérarchique, nous pouvons trouver les
différents styles musicals puis le style d’artiste/album.
Sur youtube, est-ce que la distinction officiel/pas officiel a un effet sur les écoutes ? / les likes ? / les commentaires ?
Variables : ‘Official_video’, ‘Views’, ‘Likes’, ‘Comments’
Objectif : Relation avec valeurs discrètes (nombres d’écoutes, likes, …) et nominales (official_video).
Hypothèses :
Il semblerait que le jeu de données ne propose pas de vidéos officielles et des vidéos non officielles pour un même titre donc on peut supposer que si la vidéo d'une chanson n'est pas officielle, il n'existe probablement pas de vidéo officielle.
On s'attend donc à ce qu'il n'y ai pas de grande différence entre les écoutes / likes / commentaires des vidéos officielles et non officielles.
#### nombre de views, likes et comments pour l’année
1960
Le but de cette analyse était de déterminer si le caractère officiel ou non d’une chanson avait une influence sur son nombre de vues ou de like ou de commentaires. Pour des soucis d’équitté étant donné qu’on a beaucoup plus de chanson officiel que non officielle , nous avons fondé notre analyse sur la moyenne.
Comme on pouvait s’y attendre les musique officielle sont largements plus appréciées et et regardé que les vidéos non officielles. Par contre , on peut observer autre chose , c’est que pour les chansons sortie il y’a relativement longtemps, on rencontre beaucoups plus de cas où le chansons non officielles dépassent celles officielles. c’est le cas par exemple pour les chansons sorties en 1960 où celles sorties en 1967 .
Cela s’explique par le fait que quands ces chansons sont sorties , Youtube n’était pas encore assez connue pour qu’une chaine soit systématiquement créée et la chanson postée déçu ainsi pour ces vielles chansons , se sont généralement des particulier qui les enregistre et les déposent sur Youtube
Est-ce que la fréquence de diffusion d’album / de single d’un artiste peut avoir un effet sur sa popularité ?
Variables : ‘Streams’, ‘Views’, ‘Artist’, ‘Album-type’, ‘date’ pour obtenir la fréquence
Objectif : Relation avec valeurs discrètes (nombres d’écoutes), nominales (artistes, type d’albums) et continues (fréquence).
Rappel : On peut commencer par faire l’analyse indépendemment du type de l’album, mais on a trouvé cela pertinent d’aussi voir si cette variable a un effet sur nos résultats.
On suppose que d’avoir une fréquence plus élevée de publication de titres est liée à la popularité d’un artiste. Ceci repose sur l’hypothèse que le simple fait de publier donne de l’engouement naturel à un artiste : surtout qu’ils communiquent autour de leurs publication généralement.
Le format des single cherche plus à apporter de l’engouement pour un artiste en règle générale : peut-être que si un artiste publie souvent des singles, il aura plus d’écoutes ?
dataset_if36 <- dataset_if36 %>%
filter(!is.na(date)) %>%
mutate(date = ymd(date))
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `date = ymd(date)`.
## Caused by warning:
## ! 1367 failed to parse.
dataset_if36$year <- year(dataset_if36$date)
Comme la période annuelle des données est trop grande, la période peut atteindre 50 ans. Au cours des 50 années, certains artistes peuvent avoir été inactifs pendant une longue période. Nous avons donc décidé d’étudier les données de 2019 à 2023 pour les analyser.
filtered_dataset <- dataset_if36 %>%
filter(year(date) >= 2019 & year(date) <= 2023)
artist_yearly_filtered <- filtered_dataset %>%
mutate(year = year(date)) %>%
group_by(Artist, year, Album_type) %>%
summarise(Release_Frequency = n(), Total_Streams = sum(Stream, na.rm = TRUE), .groups = 'drop')
artist_stats_filtered <- artist_yearly_filtered %>%
group_by(Artist, Album_type) %>%
summarise(Avg_Frequency_2019_2023 = mean(Release_Frequency), Avg_Streams_2019_2023 = mean(Total_Streams), .groups = 'drop')
ggplot(artist_stats_filtered, aes(x = Avg_Frequency_2019_2023, y = Avg_Streams_2019_2023, color = Album_type)) +
geom_point(alpha = 0.5, size = 0.8) +
labs(title = "La relation entre Average Yearly Release Frequency et Average Yearly Streams (2019-2023)",
x = "Average Yearly Release Frequency (2019-2023)",
y = "Average Yearly Streams (2019-2023)") +
theme_minimal() +
theme(axis.text.x = element_text(hjust = 1)) +
scale_y_continuous(labels = scales::number_format()) +
scale_color_manual(values = c("album" = "red", "single" = "blue"))
Ce graphique en nuage de points illustre la relation entre le nombre moyen d’albums publiés par an et le nombre moyen de flux de sportify par an pour chaque artiste de 2019 à 2023.
On constate que pendant cette période, la plupart des artistes ont publié en moyenne entre 0 et 3 albums par an, correspondant à des flux annuels compris entre 0 et 2 500 000 000.
Le nombre d’artistes publiant en moyenne plus de 5 albums par an est faible, et pour ceux qui publient en moyenne 10 albums par an, leur flux n’est pas significativement plus élevé que ceux qui publient moins d’albums.
En revanche, plusieurs artistes qui publient en moyenne environ 4 albums par an ont généré un flux particulièrement élevé.
Cela est conforme à la logique, car publier trop d’albums en une année peut entraîner une baisse de qualité des œuvres, ce qui peut à son tour entraîner une baisse du nombre d’écoutes. En même temps, pour les artistes très connus, même s’ils publient très peu d’albums par an, ils peuvent avoir l’occasion de générer un flux très élevé.
Les points rouges sur ce graphique représentent les œuvres des artistes sous forme d’albums, tandis que les points bleus représentent les œuvres sous forme de singles.
Nous pouvons voir que dans les zones de flux élevé, presque tous les points sont rouges, tandis que les points bleus sont plus concentrés dans les zones de faible flux. De cela, nous pouvons déduire que la forme des œuvres a une certaine influence sur le nombre de flux. La forme d’un album peut, dans une certaine mesure, aider les œuvres à obtenir plus de flux.
Ensuite, nous avons commencé à faire la même analyse sur la relation entre la fréquence annuelle moyenne de sortie d’un album et les vues sur YouTube.
filtered_dataset <- dataset_if36 %>%
filter(year(date) >= 2019 & year(date) <= 2023)
artist_yearly_filtered <- filtered_dataset %>%
mutate(year = year(date)) %>%
group_by(Artist, year, Album_type) %>%
summarise(Release_Frequency = n(), Total_Views = sum(Views, na.rm = TRUE), .groups = 'drop')
artist_stats_filtered <- artist_yearly_filtered %>%
group_by(Artist, Album_type) %>%
summarise(Avg_Frequency_2019_2023 = mean(Release_Frequency), Avg_Views_2019_2023 = mean(Total_Views), .groups = 'drop')
ggplot(artist_stats_filtered, aes(x = Avg_Frequency_2019_2023, y = Avg_Views_2019_2023, color = Album_type)) +
geom_point(alpha = 0.5, size = 0.8) +
labs(title = "La relation entre Average Yearly Release Frequency et Average Yearly Views (2019-2023)",
x = "Average Yearly Release Frequency (2019-2023)",
y = "Average Yearly Views (2019-2023)") +
theme_minimal() +
theme(axis.text.x = element_text(hjust = 1)) +
scale_y_continuous(labels = scales::number_format()) +
scale_color_manual(values = c("album" = "red", "single" = "blue"))
Cette carte de dispersion montre la relation entre la fréquence moyenne annuelle de publication d’albums et les vues annuelles moyennes pour chaque artiste sur la période 2019-2023, en distinguant les types d’albums par des couleurs différentes , où le rouge représente les albums et le bleu représente les singles .
Lorsque la fréquence moyenne annuelle de publication d’albums est faible (0-2,5), la plage de variation des vues annuelles moyennes est très large, allant de presque zéro à plus de 2 milliards.
Lorsque la fréquence moyenne annuelle de publication d’albums est élevée (2,5-10), les vues annuelles moyennes tendent à être plus faibles et les points de données sont plus clairsemés, ce qui indique qu’une augmentation de la fréquence de publication d’albums n’entraîne pas nécessairement une augmentation des vues.
Globalement, il n’y a pas de corrélation positive directe entre la fréquence moyenne annuelle de publication d’albums et les vues annuelles moyennes. Les vues élevées apparaissent plus souvent dans la zone de faible fréquence de publication d’albums.
Dans la zone de faible fréquence de publication, les singles et les albums peuvent tous deux atteindre des niveaux élevés de vues. Dans la zone de haute fréquence de publication, les singles ont quelques points de vues annuelles moyennes plus élevés, tandis que les albums ont des vues annuelles moyennes relativement plus basses, ce qui pourrait indiquer que les singles sont plus susceptibles de maintenir des vues élevées lorsqu’ils sont publiés fréquemment.
Le type d’album a un certain impact sur les vues. Bien que les deux types aient des points de données avec des vues élevées dans différentes plages de fréquence de publication, les singles ont une plus grande probabilité de maintenir des vues élevées lorsqu’ils sont publiés fréquemment.
La fréquence moyenne annuelle de publication d’albums n’a pas de relation directe avec le flux de morceaux sur Spotify et le nombre de vues sur YouTube. Il est probable que d’autres facteurs influencent davantage ces flux et ces vues. Nous supposons que ces facteurs pourraient être la popularité de l’artiste ou la qualité des chansons.
La forme de l’œuvre a un certain impact sur les flux et les vues. En ce qui concerne les flux, il semble que les gens préfèrent écouter des albums sur Spotify. Quant aux vidéos, les albums et les singles ont tous deux la possibilité d’obtenir un grand nombre de vues, mais lorsque des œuvres sont publiées fréquemment, les gens semblent préférer regarder des vidéos de singles plutôt que des albums.
Quels sont les effets d’un ‘feat’ sur un titre ?
Un ‘featuring’ en musique indique dans le titre de la chanson que celle-ci est une collaboration entre l’auteur et l’artiste featuré.
Variables : ‘Streams’, ‘Views’, ‘track’, ‘Artist’
Objectif : Relation avec valeurs discrètes (nombres d’écoutes) et nominales (track, artistes).
Hypothèses :
df_q10 <- df %>%
select(Track, Artist, Views, Stream, Likes, Comments, Speechiness) %>%
na.omit() %>%
mutate(Feat = str_detect(Track, regex("feat", ignore_case = TRUE)))
head(df_q10)
## Track Artist Views Stream
## 1 Feel Good Inc. Gorillaz 693555221 1040234854
## 2 Rhinestone Eyes Gorillaz 72011645 310083733
## 3 New Gold (feat. Tame Impala and Bootie Brown) Gorillaz 8435055 63063467
## 4 On Melancholy Hill Gorillaz 211754952 434663559
## 5 Clint Eastwood Gorillaz 618480958 617259738
## 6 DARE Gorillaz 259021161 323850327
## Likes Comments Speechiness Feat
## 1 6220896 169907 0.1770 FALSE
## 2 1079128 31003 0.0302 FALSE
## 3 282142 7399 0.0522 TRUE
## 4 1788577 55229 0.0260 FALSE
## 5 6197318 155930 0.1710 FALSE
## 6 1844658 72008 0.0372 FALSE
df_q10 %>%
ggplot(aes(x = "", fill = Feat)) +
geom_bar(position = "stack", width = 0.5) +
coord_flip() +
labs(title = "Graphique à barres empilées horizontal de Feat", x = "", y = "Count") +
theme_minimal() +
scale_fill_manual(values = c("TRUE" = "lightgreen", "FALSE" = "darkcyan"),
labels = c("TRUE" = "Avec Feat", "FALSE" = "Sans Feat"))
# Transformer les données en format long
df_long_stream_view <- df_q10 %>%
pivot_longer(cols = c(Stream, Views), names_to = "Metric", values_to = "Value")
# Créer le boxplot avec facet_wrap
df_long_stream_view %>% ggplot(aes(x = Metric, y = Value, color = Feat)) +
geom_boxplot(outliers = FALSE) +
scale_y_continuous(labels = scales::number_format()) +
facet_wrap(~ Feat) +
labs(title = "Diagramme en Boîte à moustaches de Stream et Views par \nFeat", x = "", y = "Nombre de Streams / Vues") +
theme_minimal()
# Transformer les données en format long
df_comment <- df_q10 %>%
pivot_longer(cols = c(Comments), names_to = "Metric", values_to = "Value")
# Créer le boxplot avec facet_wrap
feat_comment_plot <- df_comment %>% ggplot(aes(x = "", y = Value, color = Feat)) +
geom_boxplot(outliers = FALSE) +
scale_y_continuous(labels = scales::number_format()) +
facet_wrap(~ Feat) +
labs(title = "Commentaires", x = "", y = "Nombre de Commentaires") +
theme_minimal() +
theme(legend.position = 'none')
# Transformer les données en format long
df_like <- df_q10 %>%
pivot_longer(cols = c(Comments), names_to = "Metric", values_to = "Value")
# Créer le boxplot avec facet_wrap
feat_like_plot <- df_like %>% ggplot(aes(x = "", y = Value, color = Feat)) +
geom_boxplot(outliers = FALSE) +
scale_y_continuous(labels = scales::number_format()) +
facet_wrap(~ Feat) +
labs(title = "Likes", x = "", y = "Nombre de Likes") +
theme_minimal()
feat_comment_plot + feat_like_plot + plot_annotation(title = "Diagrammes en boîte à moustache de Commentaires et de Likes par Feat")
df_speechiness <- df_q10 %>%
pivot_longer(cols = c(Speechiness), names_to = "Metric", values_to = "Value")
# Créer le boxplot avec facet_wrap
df_speechiness %>% ggplot(aes(x = "", y = Value, color = Feat)) +
geom_boxplot(outliers = FALSE) +
#scale_y_continuous(labels = scales::number_format()) +
facet_wrap(~ Feat) +
labs(title = "Diagrammes en boîte à moustache de Speechiness en fonction de Feat", x = "", y = "Speechiness") +
theme_minimal()
# Create the violin plot with facet_wrap
speechiness_plt <- ggbetweenstats(
data = df_q10,
x = Feat,
y = Speechiness,
plot.type = "violin",
pairwise.comparisons = FALSE, # Disable pairwise comparisons if not needed
results.subtitle = FALSE, # Disable the summary statistics subtitle
results.title = FALSE, # Disable the results title at the bottom right
centrality.plotting = FALSE, # Disable mean value annotation
xlab = "",
ylab = "Speechiness",
title = "Graphique en Violon de Speechiness par Feat",
point.args = list(position = ggplot2::position_jitterdodge(dodge.width = 1), alpha = 0.2, size = 1, stroke = 0, na.rm = TRUE),
ggtheme = theme_minimal()
)
# Customize the plot appearance
speechiness_plt <- speechiness_plt +
theme(
axis.ticks = element_blank(),
axis.line = element_line(colour = "grey50"),
panel.grid = element_line(color = "#b4aea9"),
panel.grid.minor = element_blank(),
panel.grid.major.x = element_blank(),
panel.grid.major.y = element_line(linetype = "dashed"),
panel.background = element_rect(fill = "#fbf9f4", color = "#fbf9f4"),
plot.background = element_rect(fill = "#fbf9f4", color = "#fbf9f4")
)
# Display the plot
speechiness_plt
## Warning in min(x): min里所有的参数都不存在; 回覆Inf
## Warning in max(x): max里所有的参数都不存在;回覆-Inf
Lors de nos recherches pour ce projet, nous avons trouvé les visualisations issus du projet TidyTuesday très inspirants.
Le TidyTuesday Challenge est une initiative hebdomadaire organisée par la communauté R for Data Science (R4DS), où les participants sont invités à explorer, nettoyer et visualiser des jeux de données fournis chaque mardi, en utilisant les principes de la “tidyverse” en R. Cet exercice vise à améliorer les compétences en manipulation de données et en visualisation tout en favorisant l’apprentissage collaboratif et le partage de solutions créatives au sein de la communauté.
Nous avons fait une petite exploration avec le script de Jake Kaupp (@jkaupp sur github) pour essayer de le comprendre et approfondir notre maitrise de R et des packages Tidyverse.
Ci-dessous se trouve notre exploration du code de Jake Kaupp pour notre jeu de données puis sa visualisation pour une itération du TidyTuesday.
rush <- df %>%
filter(!is.na(Track), Artist %in% c("Metallica", "Smash Mouth", "ABBA", "Britney Spears", "Wolfgang Amadeus Mozart"), Track %in% c("Screaming Suicide", "All Star", "Dancing Queen", "Toxic", "Piano Concerto No. 21 in C Major, K. 467: II. Andante")) %>%
distinct(Track, .keep_all = TRUE) %>%
select(Track, Artist, Danceability, Energy, Speechiness, Acousticness, Instrumentalness, Liveness, Valence, Tempo) %>%
mutate(color = c("#f7b801","#f18701","#f35b04","darkred","red")) %>%
mutate_at(vars(Track, Artist), as.character) %>%
mutate_at(vars(Danceability:Tempo), function(x) x/max(x)) %>%
pivot_longer(Danceability:Tempo)
bg <- df %>%
distinct(Uri, .keep_all = TRUE) %>%
distinct(Track, Artist, .keep_all = TRUE) %>%
filter(!is.na(Track)) %>%
select(Track, Artist, Danceability, Energy, Speechiness, Acousticness, Instrumentalness, Liveness, Valence, Tempo) %>%
mutate(color = "#d8dee9") %>%
mutate_at(vars(Danceability:Tempo), function(x) x/max(x)) %>%
pivot_longer(Danceability:Tempo)
test_plot <- ggplot(bg, aes(x = name, y = value)) +
geom_line(aes(color = color, group = Track), alpha = 0.1, size = 0.1) +
geom_line(data = rush, aes(color = color, group = Artist), size = 0.5) +
geom_point(data = rush, aes(color = color, group = Artist), size = 1) +
geom_text(data = filter(rush, name == "Valence"), aes(label = glue("{str_replace_all(Artist, '(?<=.)(?!$)', ' ')}\n{Track}"), colour = color), family = "Arial", hjust = 0, nudge_x = 0.1, nudge_y = c(-0.05, 0, 0)) +
scale_color_identity() +
scale_fill_identity() +
scale_y_continuous(breaks = c(0, 0.5, 1), labels = c("Bas", "Moy", "Haut")) +
scale_x_discrete(labels = function(x) str_replace_all(x, "(?<=.)(?!$)", " ")) +
expand_limits(x = c(1, 10)) +
labs(title = "Charactéristiques Musicales de quelques chansons",
x = NULL,
y = NULL) +
theme_dark() +
theme(axis.text.x = element_text(angle = 30, hjust = 1, size = 6),
legend.position = "none")
test_plot
## Warning in y + params$y: 长的对象长度不是短的对象长度的整倍数
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## Windows字体数据库里没有这样的字体系列

Lien vers le script de @jkaupp sur github
Y-a-t-il un lien entre les valeurs des différents attributs comme ‘danceability’ et ‘energy’ ?
Variables : attributs quantitatifs
Objectif : Relation + Comparaison avec valeurs continues (attributs).
Hypothèses :
On s’attend à ce qu’il y ai des liens plus forts entre certains attributs qu’avec d’autres.
Après tous les questions et recherches précédentes et par l’expérience dans la vie quotidienne, on peut déjà avoir une hypothèse que certain variable quantitatifs peuvent avoir une corrélation avec les autres. Le but de cette question est d’essayer faire une analyse et quantifier ces corrélation entre les attributs. On peut facilement calculer la matrice de corrélation entre ces attributs.
library(ggplot2)
library(tidyverse)
library(reshape2)
##
## 载入程辑包:'reshape2'
## The following object is masked from 'package:tidyr':
##
## smiths
par(family = "sans")
data <- read.csv("dataset_if36.csv")
variables_actives <- data %>% select(Danceability,
Energy,
Key,
Loudness,
Speechiness,
Acousticness,
Instrumentalness,
Liveness,
Valence,
Tempo)
matrice_corrélation <- cor(variables_actives)
inertie_totale <- rowSums(matrice_corrélation)
critère_tri <- order(inertie_totale, decreasing = TRUE)
matrice_triée <- matrice_corrélation[critère_tri, critère_tri]
cor_df <- as.data.frame(as.table(matrice_triée))
colnames(cor_df) <- c("variables_x", "variables_y", "valeur")
ggplot(cor_df,
aes(variables_y,
variables_x,
fill = valeur,
label = round(valeur, 2))) +
geom_tile(color = "white") +
geom_text(color = "black") +
scale_fill_gradient2(low = "blue",
high = "red",
mid = "GRAY",
midpoint = 0,
limit = c(-1,1),
space = "Lab",
name="Corrélation") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45,
vjust = 1,
size = 10,
hjust = 1)) +
coord_fixed() +
labs(title = "Matrice de corrélation") +
theme(plot.title = element_text(hjust = 0.5))
Voici la matrice de corrélation. Nous voyons bien que la corrélation entre “Danceability” et “Energy” est 0.24. Le lien entre ces deux variables existe mais n’est pas très fort. La variable plus corrélée avec “Dancability” est “Valence”(0.46). #### Conclustion Cette matrice nous permet aussi de consulter la corrélation entre les n’importe quel binôme de variable, que ce soit positif ou négatif.
Variables : année, durée
Objectif : comparaison + évolution (attributs).
Hypothèses : de manière générale , il est facile de se rendre compte que les chasons qui qui sortaient au paravant étaient deux fois plus longues que celles qui sortent actuellement d’ailleurs la longueur des chanson se réduit de plus en plus. En effet , les chansons allaient jusqu’à 7 minutes et maintenant elles tournnent autour de 3 minutes.
on s'attend donc à une visualisation sur laquelle on pourra remarqué que pour les décénies , les plus éloignée on aura beaucoup plus de chanson avec une durée relativement forte , tandis que avec l'évolution du temps , la répartition changera et on aura beaucoups plus de chanson de faible durée.
Le but de cette question était d’évaluer la répartition des durée des différentes chansons et de comparer cette répartition en fonction de l’année de sortie de chaque chanson. L’hypothèse était que plus les musiques sont récentes et plus elles sont courtes de façon globales.
La première chose que l’on remarque sur cette visualisation est que , sur quasiment toutes les périodes , la durée de musique la plus répandue se trouve entre 3 et 4 minutes . Cela peut s’observer par des piques de l’histogramme à ce niveau là
La deuxième chose que l’on remarque , c’est que plus rentre dans le temps , c’est-à-dire vers les années 1980 et autres et plus on a des chansons qui ont une durée de 6 à 7 minutes. c’est le cas par exemple autour des années 1980. on observer également en 1973 un nombre relativement élevé de musique dont la durée varie entre 4 et 6 minutes , ce qui confirme un peu notre hypothèse. Enfin on peut remarquer que à partir des année 2010, on note beaucoup moins de chanson ayant une durée supérieure à 5 minutes par rapport aux années précédentes
Lors de nos recherches pour ce projet, nous avons trouvé les visualisations issus du projet TidyTuesday très inspirants.
Le TidyTuesday Challenge est une initiative hebdomadaire organisée par la communauté R for Data Science (R4DS), où les participants sont invités à explorer, nettoyer et visualiser des jeux de données fournis chaque mardi, en utilisant les principes de la “tidyverse” en R. Cet exercice vise à améliorer les compétences en manipulation de données et en visualisation tout en favorisant l’apprentissage collaboratif et le partage de solutions créatives au sein de la communauté.
Nous avons fait une petite exploration avec le script de Jake Kaupp (@jkaupp sur github) pour essayer de le comprendre et approfondir notre maitrise de R et des packages Tidyverse.
Ci-dessous se trouve notre exploration du code de Jake Kaupp pour notre jeu de données puis sa visualisation pour une itération du TidyTuesday.
#
# rush <- df %>%
# filter(!is.na(Track), Artist %in% c("Metallica", "Smash Mouth", "ABBA", "Britney Spears", "Wolfgang Amadeus Mozart"), Track %in% c("Screaming Suicide", "All Star", "Dancing Queen", "Toxic", "Piano Concerto No. 21 in C Major, K. 467: II. Andante")) %>%
# distinct(Track, .keep_all = TRUE) %>%
# select(Track, Artist, Danceability, Energy, Speechiness, Acousticness, Instrumentalness, Liveness, Valence, Tempo) %>%
# mutate(color = c("#f7b801","#f18701","#f35b04","darkred","red")) %>%
# mutate_at(vars(Track, Artist), as.character) %>%
# mutate_at(vars(Danceability:Tempo), function(x) x/max(x)) %>%
# pivot_longer(Danceability:Tempo)
#
#
# bg <- df %>%
# distinct(Uri, .keep_all = TRUE) %>%
# distinct(Track, Artist, .keep_all = TRUE) %>%
# filter(!is.na(Track)) %>%
# select(Track, Artist, Danceability, Energy, Speechiness, Acousticness, Instrumentalness, Liveness, Valence, Tempo) %>%
# mutate(color = "#d8dee9") %>%
# mutate_at(vars(Danceability:Tempo), function(x) x/max(x)) %>%
# pivot_longer(Danceability:Tempo)
#
#
# test_plot <- ggplot(bg, aes(x = name, y = value)) +
# geom_line(aes(color = color, group = Track), alpha = 0.1, size = 0.1) +
# geom_line(data = rush, aes(color = color, group = Artist), size = 0.5) +
# geom_point(data = rush, aes(color = color, group = Artist), size = 1) +
# geom_text(data = filter(rush, name == "Valence"), aes(label = glue("{str_replace_all(Artist, '(?<=.)(?!$)', ' ')}\n{Track}"), colour = color), family = "Arial", hjust = 0, nudge_x = 0.1, nudge_y = c(-0.05, 0, 0)) +
# scale_color_identity() +
# scale_fill_identity() +
# scale_y_continuous(breaks = c(0, 0.5, 1), labels = c("Bas", "Moy", "Haut")) +
# scale_x_discrete(labels = function(x) str_replace_all(x, "(?<=.)(?!$)", " ")) +
# expand_limits(x = c(1, 10)) +
# labs(title = "Charactéristiques Musicales de quelques chansons",
# x = NULL,
# y = NULL) +
# theme_dark() +
# theme(axis.text.x = element_text(angle = 30, hjust = 1, size = 6),
# legend.position = "none")
#
# test_plotn
